<?php
//应用处理类
//www.hdblog.com/index.php?a=show&bid=23
final class Application{
	static public function run(){
		spl_autoload_register(array(__CLASS__,"autoload"));//注册自动加载方法
		//错误处理
		set_error_handler(array(__CLASS__,"error"),E_ALL);
		self::setConst();//定义常量
		self::createAppPath();//创建应用基本目录
		self::init();//初始化应用
		self::loadConfig();//加载配置项
		self::appRun();//运行应用
		self::debug();//调试模式
	}
	static public function error($errType,$error,$file,$line){
		switch($errType){
				case E_ERROR:
				case E_USER_ERROR:
				case E_WARNING:
				    $e['file']=$file;
				    $e['line']=$line;
				    $e['message']="Time:".date("y-m-d h:i:s")."Error:".$error.' File:'.$file.'('.$line.")\n";	  
				    if(C("ERROR_LOG"))
				    	log::write($e['message']);
				       halt($e);	
				  break;
				default:
					echo " default";
			}
	}
	//调试模式
	static private function debug(){
		if(C("DEBUG"))
		debug::show();
	}
	//注册自动加载方法
	static private function autoload($className){
		if(substr($className,-7)=="Control" && strlen($className)>7){
			$classFile = PATH_APP.'/control/'.$className.'.class.php';	
		}else{
			$classFile = PATH_HDEASY_ROOT.'/class/'.$className.'.class.php';	
		}
		if(is_file($classFile)){
			include $classFile;
		}else{
			die("类文件".$classFile."不存在");
		}
	}
	static private function createAppPath(){
		$dirs =array(
			"app"=>PATH_APP,//应用文件夹
			"control"=>PATH_APP.'/control',//控制器文件夹
			"config"=>PATH_APP.'/config',//配置文件夹
			"tpl"=>PATH_APP.'/tpl',//模板文件夹
			"model"=>PATH_APP.'/model'//模板文件夹
		);
		foreach($dirs as $d){
			@is_dir($d) || mkdir($d);
		}
	}
	//定义常量
	static private function setConst(){
		//$_GET['c']代表控制器
		//$_GET['m']代表方法
		if(!defined("PATH_APP")){
			define("PATH_APP",PATH_ROOT.'/'.APP);//应用的文件夹
		}
		$control = isset($_GET['c'])?$_GET['c']:"index";
		$method = isset($_GET['m'])?$_GET['m']:"index";
		define("CONTROL",$control);
		define("METHOD",$method);
		define("PATH_CONTROL",PATH_APP.'/'.CONTROL);//控制器目录
		define("PATH_TPL",PATH_APP.'/tpl');//模板目录
		define("__ROOT__","http://".$_SERVER['HTTP_HOST']);//网站根地址
		define("__WEB__",__ROOT__.'/'.trim(dirname($_SERVER['SCRIPT_NAME']),'/'));
		define("__HDEASY__",__ROOT__.'/'.str_replace($_SERVER['DOCUMENT_ROOT'],'',PATH_HDEASY_ROOT));
		define("__APP__",__ROOT__.'/'.str_replace($_SERVER['DOCUMENT_ROOT'],'',PATH_APP));
		define("__TPL__",__ROOT__.'/'.str_replace($_SERVER['DOCUMENT_ROOT'],'',PATH_TPL));
		define("__CONTROL__",__ROOT__.'/'.$_SERVER['SCRIPT_NAME'].'?c='.CONTROL);
	}
	//加载配置项
	static private function loadConfig(){
		C(include PATH_APP.'/config/config.php');
	}
	//初始化应用
	static private function init(){
		$config = PATH_APP.'/config/config.php';//应用配置文件
		if(is_file($config)){
			return false;
		}
$indexControl=<<<str
<?php
 class IndexControl extends Control{
 	function __init(){
 		header("Content-type:text/html;charset=utf-8");
 	}
 	function index(){
 		echo "<div style='border:solid 1px #dcdcdc;padding:20px;width:600px;font-size:35px;text-align:center;'>欢迎使用HDEASY框架</h1>";
 	}
 }
?>
str;
	copy(PATH_HDEASY_ROOT.'/core/config.php', PATH_APP.'/config/config.php');//复制配置文件
	file_put_contents(PATH_APP."/control/IndexControl.class.php", $indexControl);
	}
	//运行应用 die("控制器文件不存在");
	static private function appRun(){
		$controlFile = PATH_APP.'/control/'.CONTROL.'Control.class.php';//控制器文件
		if(is_file($controlFile)){
			include $controlFile;//加载控制器文件
			$controlClass  = CONTROL.'Control';//控制器的类
			if(!class_exists($controlClass)){
				header("Content-type:text/html;charset=utf-8");
				die("控制器类:{$controlClass}不存在");
			}
			$controlObj = new $controlClass;//实例化出控制器对象
		}else{
			$hdEmptyClassFile = PATH_APP.'/control/HdEmptyControl.class.php';//空控制器文件
			if(is_file($hdEmptyClassFile)){
				include $hdEmptyClassFile;
				$controlObj = new HdEmpty();
			}else{
				header("Content-type:text/html;charset=utf-8");
				die("控制器类不存在");
			}
		}
		$method = METHOD;
		if(!method_exists($controlObj, $method)){
			//空方法
			if(method_exists($controlObj,"__empty")){
				$controlObj->__empty();
			}else{
				header("Content-type:text/html;charset=utf-8");
				error("您访问的方法{$method}不存在");
			}
		}else{
			$controlObj->$method();//执行控制器文件
		}

	}
}

?>

